在comp.lang.c ++。moderated上閱讀了C ++ / STL的“隱藏功能”和“黑暗角落”之後,我完全驚訝於以下代碼段在Visual Studio 2008和G ++ 4.4中都可以編譯並正常工作。 這是代碼: #includeint main() { 整數x = 10; while(x-> 0)// x變為0 { printf(“%d”,x); } } 輸出: 9 8 7 6 5 4 3 2 1 0 我認為這是C,因為它也可以在GCC中使用。該標准在哪裡定義,以及它來自何處?
->不是運算符。實際上,它是兩個單獨的運算符,-和>。 條件代碼將x遞減,同時返回x的原始(未遞減)值,然後使用>運算符將原始值與0比較。 為了更好地理解,該語句可以編寫如下: while((x--)> 0) | 或者對於完全不同的東西... x滑到0。 而(x-\ \ \ \ > 0) printf(“%d”,x); 並不是那麼數學,但是...每張畫都畫一千個字... | 這是一個非常複雜的運算符,因此即使是ISO / IEC JTC1(聯合技術委員會1)也將其說明放在C ++標準的兩個不同部分中。 除了開玩笑,它們是兩個不同的運算符:-和>分別在C ++ 03標準的5.2.6 / 2和5.9節中進行了描述。 | 相當於 而(x--> 0) x--(後減量)等效於x = x-1,因此代碼轉換為: while(x> 0){ x = x-1; //邏輯 } X - ; //當x <= 0時完成後遞減 | x可以在相反的方向更快地變為零: 整數x = 10; 而(0 <---- x) { printf(“%d”,x); } 8 6 4 2 您可以用箭頭控制速度! 整數x = 100; while(0 <-------------------- x) { printf(“%d”,x); } 90 80 70 60 50 40 30 20 10 ;) | 它的 #includeint main(void){ 整數x = 10; while(x--> 0){// x變為0 printf(“%d”,x); } 返回0; } 只是空間使事情看起來很有趣,即遞減並進行比較。 | ->的用法具有歷史意義。減少(在某些情況下仍然是)比在x86架構上增加要快。使用->表示x即將變為0,並吸引那些具有數學背景的人。 | 而(x--> 0) 是這樣解析的。 | 極客,但我會用這個: #定義為; while int main(int argc,char * argv []) { int n = atoi(argv [1]); 將printf(“ n為%d \ n”,n)做為(n-> 0); 返回0; } | 我讀過的一本書(我不記得是哪本書)說:編譯器嘗試使用左右規則將表達式解析為最大標記。 在這種情況下,表達式為: x-> 0 解析為最大令牌: 令牌1:x 令牌2:- 令牌3:> 令牌4:0 結論:x--> 0 相同的規則適用於此表達式: a ----- b 解析後: 令牌1: 令牌2:- 令牌3:- 令牌4:- 令牌5:b 結論:(a-)--b 我希望這有助於理解複雜的表達方式^^ | 這與 而(x--) { printf(“%d”,x); } 對於非負數 | 無論如何,我們現在有一個“轉到”運算符。容易記住“->”作為方向,而“ x趨於零時”則很簡單。 此外,它在某些平台上比“ for(x = 10; x> 0; x-)”有效。 | 此代碼首先將x與0比較,然後將x減1。 (也請在第一個答案中說:先遞減x,然後將x和0與>運算符進行比較。)請參見以下代碼的輸出: 9 8 7 6 5 4 3 2 1 0 現在,我們首先進行比較,然後通過在輸出中看到0來遞減。 如果我們要先遞減然後比較,請使用以下代碼: #include int main(無效) { 整數x = 10; while(--x> 0)// x變為0 { printf(“%d”,x); } 返回0; } 該輸出是: 9 8 7 6 5 4 3 2 1 | 運行此代碼時,我的編譯器將打印出9876543210。 #include int main() { 整數x = 10; while(x-> 0)// x變為0 { std :: cout << x; } } 如預期的那樣。 while(x--> 0)實際上意味著while(x> 0)。 x--後減x。 而(x> 0) { X - ; std :: cout << x; } 是寫同一件事的另一種方式。 很好的是,原來看起來像“而x變為0”。 | -和>之間缺少空格。 x是遞減的,也就是說,在檢查條件x> 0?之後遞減。 | -是減量運算符,而>是大於運算符。 這兩個運算符像->一樣應用為單個運算符。 | 它是兩個運算符的組合。首先-用於減小值,而>用於檢查該值是否大於右側操作數。 #include int main() { 整數x = 10; 而(x--> 0) printf(“%d”,x); 返回0; } 輸出將是: 9 8 7 6 5 4 3 2 1 0 | 實際上,x是遞減的,並且正在檢查該條件。不是->(x--)> 0 注意:檢查條件後,x的值會更改,因為它會遞減。也會發生一些類似的情況,例如: -> x-> 0 ++> x ++> 0 -> = x-> = 0 ++> = x ++> = 0 | C和C ++遵守“最大嚼數”規則。將a --- b轉換為(a--)-b的方法相同,在您的情況下,x-> 0轉換為(x-)> 0。 規則本質上是說,從左到右,表達式是通過採用將構成有效表達式的最大字符組成的。 | 為什麼所有的並發症? 原始問題的簡單答案是: #include int main() { 整數x = 10; 而(x>0) { printf(“%d”,x); x = x-1; } } 它做同樣的事情。我並不是說您應該這樣做,但是它做同樣的事情,並且會在一篇文章中回答這個問題。 x--只是上述的簡寫,而>只是普通的大於運算符。沒什麼大不了的! 如今有太多人使簡單的事情變得複雜;) | 以常規方式,我們將在while循環括號()中定義一個條件,並在括號{}中定義一個終止條件,但是->會同時定義這兩個條件。 例如: int abc(無效) { 整數a = 5 while(((a--)> 0)//同時減少和比較 { //代碼 } } 這會減小a並在a大於0時運行循環。 按照慣例,它將是: int abc(無效) { 整數= 5; 而(a> 0) { 一種 - ; //代碼 } 一種 - ; } 兩種方式,我們都做相同的事情,實現相同的目標。 | (x-> 0)表示(x--> 0)。 您可以使用(x->)輸出:9 8 7 6 5 4 3 2 1 0 您可以使用(-x> 0)表示(--x> 0)輸出:9 8 7 6 5 4 3 2 1 您可以使用 (- \ x> 0) 輸出:9 8 7 6 5 4 3 2 1 您可以使用 (\ \ x-> 0) 輸出:9 8 7 6 5 4 3 2 1 0 您可以使用 (\ \ x-> 0 \ \ ) 輸出:9 8 7 6 5 4 3 2 1 0 您也可以使用 ( X -> ) 輸出:9 8 7 6 5 4 3 2 1 0 同樣,您可以嘗試許多方法來成功執行此命令。 | 這是一元後遞減運算符。 while(x--> 0)// x變為0 { printf(“%d”,x); } 在開始時,條件將評估為 (x> 0)// 10> 0 現在因為條件為真,它將以遞減的值進入循環 x-- // x = 9 這就是為什麼第一個打印值為9 等等。在最後一個循環中x = 1,因此條件為true。按照一元運算符,在打印時該值變為x = 0。 現在,x = 0,它將條件(x> 0)評估為false,而while循環退出。 | ->根本不是運算符。我們有一個類似於->的運算符,但不像->那樣。這只是對while(x--> 0)的錯誤解釋,這僅意味著x具有後減量運算符,並且此循環將一直運行到大於零為止。 編寫此代碼的另一種簡單方法是while(x--)。 while循環將在出現錯誤條件時停止,並且這裡只有一種情況,即0。因此,當x值減小到零時,它將停止。 | 高度活躍的問題。贏得10個聲譽才能回答這個問題。信譽要求有助於保護該問題免受垃圾郵件和非答復活動的侵害。 不是您要找的答案?瀏覽標記為c ++ c運算符的其他問題,其代碼格式符合標準,或者提出您自己的問題。